// mem.cpp
//
// Copyright (C) 2008  Maksim Sipos <msipos@mailc.net>
//
// This file is a part of the Ripe language project.
//
// Ripe is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

#include "standard.hpp"
#include <cstdio>
#include <cstring>
#include "util/mem.hpp"

namespace Ripe {

void mem_free(void* ptr)
{
  free(ptr);
}

void* mem_malloc(size_t size) throw (ErrorAlloc)
{
  void* p = std::malloc(size);
  if (p == NULL) throw ErrorAlloc();
  return p;
}

void* mem_realloc(void* ptr, size_t size) throw (ErrorAlloc)
{
  void* p = std::realloc(ptr, size);
  if (p == NULL) throw ErrorAlloc();
  return p;
}

char* mem_strdup(const char* s) throw(ErrorAlloc)
{
  if (s == NULL)
    return NULL;
  uint32_t len = std::strlen(s);
  char* d = (char*) mem_malloc(len + 1);
  std::strcpy(d, s);
  return d;
}

}

void *operator new(size_t size) throw (Ripe::ErrorAlloc)
{
  void *p = malloc(size);

  if(!p) throw Ripe::ErrorAlloc();
  return p;
}

void *operator new[](size_t size) throw (Ripe::ErrorAlloc)
{
  void *p = malloc(size);

  if(!p) throw Ripe::ErrorAlloc();
  return p;
}

void operator delete(void *p)
{
  free(p);
}

void operator delete[](void *p)
{
  free(p);
}

